
#include "lcd.h"
#include <LiquidCrystal_I2C.h>


Lcd::Lcd(int rows, int cols): i2cLcd(I2C_ADDR, rows, cols)
{
  m_rows = rows;
  m_cols = cols;
}

void Lcd::setup()
{
    Wire.beginTransmission(I2C_ADDR);
    byte error = Wire.endTransmission();
    if (error == 0)
      Serial.println("I2C device found at address " + String(I2C_ADDR) + "\n");
    else     
      Serial.println("ERROR: I2C device NOT found at address " + String(I2C_ADDR) + "\n");
  
   i2cLcd.init();                      // initialize the lcd 
   i2cLcd.backlight();
   i2cLcd.home();
}

void Lcd::clear()
{
  i2cLcd.clear();
}

void Lcd::displayText (String line1, String line2)
{
  //No borro el display al escribir un texto nuevo porque eso hace que parpadee bastante.
  //Como contrapartida, si se va a escribir un texto más corto que el anterior, hay que
  //borrar expresamente la pantalla

  boolean bScrollLine1 = (line1.length() > m_cols);
  boolean bScrollLine2 =  (line2.length() > m_cols);

  int excess1 = 0;
  int excess2 = 0;
  if (bScrollLine1)
    excess1 = line1.length() - m_cols;
  if (bScrollLine2)
    excess2 = line2.length() - m_cols;
  
  for (int i = 0; i <= excess1 || i <= excess2; i++)
  {
      String substr1 = bScrollLine1 ? line1.substring(i, line1.length()) : line1;
      displayText1ExactLength(substr1, 0);
      String substr2 = bScrollLine2 ? line2.substring(i, line2.length()) : line2;
      displayText1ExactLength(substr2, 1);
      delay(150);
  }
}

void Lcd::displayText1ExactLength(String line, int row)
{
  //No borro el display al escribir un texto nuevo porque eso hace que parpadee bastante.
  //Como contrapartida, si se va a escribir un texto más corto que el anterior, hay que
  //borrar expresamente la pantalla
  if (line.length() > m_cols)
    line = line.substring(0, m_cols);
    
  char lineChar[m_cols + 1];
  memset(lineChar, ' ', sizeof(lineChar));
  line.toCharArray(lineChar, sizeof(lineChar));

  if (line.length() < m_cols)
  {
    int paddingSize = m_cols - line.length();
    memmove( lineChar + paddingSize, lineChar, strlen( lineChar ) + 1 );
    memset( lineChar, ' ', paddingSize );
  }

  i2cLcd.setCursor(0, row);
  i2cLcd.print(lineChar);
}

void Lcd::createChar(int charNum, byte customChar[8])
{
  i2cLcd.createChar(charNum, customChar);
}

void Lcd::showCustomChar(int charNum, int row, int col)
{
  i2cLcd.setCursor(col, row);
  i2cLcd.write(charNum);
}
